package lp2.projeto.gerenciador;
import static org.junit.Assert.*;
import lp2.projeto.horario.*;

import org.junit.*;


public class GerenciadorTest {
	Gerenciador gerente;
	Contato contato1, contato2;
	Evento evento1,evento2;

	/**
	 * Carrega um conjunto de dados pre-definidos
	 */
	@Before
	public void test() {
		gerente = new Gerenciador();	
		contato1 = new Contato("Fulano",  "fulano@gmail.com" ,  "10/10/1990", new FormaDeContato("Skype","sicrano@gmail.com ", "Nada a comentar"));
		contato2 = new Contato("Sicrano", "sicrano@gmail.com" , "09/09/1999", new FormaDeContato("Skype","sicrano@gmail.com ", "Nada a comentar"));	
		evento1 = new Evento("Prova", new Horario(10,Mes.ABRIL,10,10,10), "Prova Calc 2", 120, "sem tipo");
		evento2 = new Evento("Prova", new Horario(12,Mes.JANEIRO,12,12,12), "Prova Fisic 3", 120, "sem tipo");
	}
	
	/**
	 * Faz o teste da adicao de contatos
	 */
	@Test public void testaAdicionaGetContato(){
		
		gerente.adicionaContato(contato1);
		assertTrue("Set ou Adiciona com erro", gerente.getContatos().contains(contato1));
		gerente.adicionaContato(contato2);
		assertTrue("Set ou Adiciona com erro", gerente.getContatos().contains(contato1));
		assertTrue("Set ou Adiciona com erro", gerente.getContatos().contains(contato2));	
	}
	
	/**
	 * Testa a adicao de eventos
	 */
	@Test public void testaAdicionaGetEvento(){
		
		gerente.adicionaEvento(evento1);
		assertTrue("Set ou Adiciona com erro", gerente.getEventos().contains(evento1));
		gerente.adicionaEvento(evento2);
		assertTrue("Set ou Adiciona com erro", gerente.getEventos().contains(evento1));
		assertTrue("Set ou Adiciona com erro", gerente.getEventos().contains(evento2));	
	}
	
	/**
	 * Testa a busca de contatos por nome
	 */
	@Test public void testaBuscaContatoPorNome(){
		gerente.adicionaContato(contato1);
		gerente.adicionaContato(contato2);
		assertTrue(gerente.buscaContatoPorNome("Fula").contains(contato1));
		assertTrue(gerente.buscaContatoPorNome("Sic").contains(contato2));
		assertTrue(gerente.buscaContatoPorNome("Si").contains(contato2));
		assertTrue(gerente.buscaContatoPorNome("Ful").contains(contato1));
		assertTrue(!gerente.buscaContatoPorNome("Sic").contains(contato1));		
	}
	
	/**
	 * Testa adicao de contatos a evento e a busca de evento por contatos
	 */
	@Test public void testa_AdicionaContatoAEvento_BuscaEventoPorContato(){
		gerente.adicionaContato(contato1);
		gerente.adicionaContato(contato2);
		gerente.adicionaEvento(evento1);
		gerente.adicionaEvento(evento2);
		gerente.adicionaContatoAEvento(contato1, evento1);
		// Contato 1 est� no evento 1, mas o contato 2 n�o
		assertTrue(gerente.getEventoPorContato(contato1).contains(evento1));
		assertTrue(!gerente.getEventoPorContato(contato2).contains(evento1));
		gerente.adicionaContatoAEvento(contato1, evento2);
		gerente.adicionaContatoAEvento(contato2, evento2);
		// Os dois contatos est�o no evento 2
		assertTrue(gerente.getEventoPorContato(contato1).contains(evento2));
		assertTrue(gerente.getEventoPorContato(contato2).contains(evento2));
	}
	
	/**
	 * Testa a remocao de contatos
	 */
	@Test public void testaRemoveContato(){
		gerente.adicionaContato(contato1);
		gerente.adicionaContato(contato2);
		gerente.adicionaEvento(evento1);
		gerente.adicionaEvento(evento2);
		gerente.adicionaContatoAEvento(contato1, evento1);
		// Demonstra que o contato1 est� na lista de contatos do evento 1
		assertTrue(gerente.getContatoPorEvento(evento1).contains(contato1));
		gerente.removeContato(contato1);
		// Demonstra que o contato1 n�o est� mais na agenda e nem na lista de contatos do evento 1
		assertTrue(!gerente.getContatos().contains(contato1));
		assertTrue(!gerente.getContatoPorEvento(evento1).contains(contato1));
	}

}
